﻿using System;
using System.Linq;
using System.Collections.Generic;
using System.Text;
using System.Data.SqlServerCe;
using System.Collections;

namespace CPTECH.Repository
{
    class FisicoDB: BaseDB
    {
        private static FisicoDB instance;

        private FisicoDB() { }

        public static FisicoDB getInstance()
        {
            if (instance == null)
            {
                instance = new FisicoDB();
            }
            return instance;
        }

        //seleciona o ultimo resgistro sequencial.
        public Int64 getLastID()
        {
            Int64 result = 0;
            try
            {
                this.open();
                SqlCeCommand command = new SqlCeCommand("select MAX(id_seq) from tb_fisico;", this.conn);
                SqlCeDataReader rdr = command.ExecuteReader();
                while (rdr.Read())
                {
                    result = rdr.GetInt64(0);
                }
            }
            catch (Exception)
            {
                result = 0;
            }
            finally
            {
                this.close();
            }
            return result;
        }

        //inseri um registro novo.
        public bool insertNewFisico(Int64 idSeq, string cdFisFilial, string cdFisPat, string cdFisInc, string status, string cdFisPlanta, string cdFisDepto,
                                    string cdFisCcusto, string cdFisLocal, string cdDesc, string dsItem, string marca, string modelo, string capacidade,
                                    string complemento, string nrFabricacao, string dtEstimada, string livre1, string livre2, string livre3, string livre4,
                                    string idPalm, string dtInventario, string os, string cdFisPatAntigo, string partNumber,
                                    string situacao, string tag, string padrao, string dtReal, string fornecedor, string enviado)
        {
            bool resposta = false;
            try
            {
                this.open();
                SqlCeCommand command = new SqlCeCommand("insert into TB_FISICO values('" + idSeq + "','" + cdFisFilial + "','" + cdFisPat +
                                                        "','" + cdFisInc + "','" + status + "','" + cdFisPlanta + "','" + cdFisDepto +
                                                        "','" + cdFisCcusto + "','" + cdFisLocal + "','" + cdDesc + "','" + dsItem +
                                                        "','" + marca + "','" + modelo + "','" + capacidade + "','" + complemento +
                                                        "','" + nrFabricacao + "','" + dtEstimada + "','" + livre1 + "','" + livre2 + "','" + livre3 +
                                                        "','" + livre4 + "','" + idPalm + "','" + dtInventario + "','" + os +
                                                        "','" + cdFisPatAntigo + "','" + partNumber + "','" + situacao +
                                                        "','" + tag + "','" + padrao + "','" + dtReal + "','" + fornecedor + "','" + enviado + "');", this.conn);
                command.ExecuteNonQuery();
                resposta = true;
            }
            catch (FormatException)
            {
                resposta = false;
            }
            finally
            {
                this.close();
            }
            return resposta; 
        
        }

        //método que retorna todos os valores da tabela TB_FISICO de acordo com o patrimonio Informado.
        public ArrayList selectByPat(string codPat)
        {
            try
            {
                this.open();
                SqlCeCommand command = new SqlCeCommand("SELECT * FROM tb_fisico WHERE cd_fis_pat='"+codPat+"';", this.conn);
                //command.Parameters.AddWithValue("@codPat", codPat);
                SqlCeDataReader rdr = command.ExecuteReader();
                ArrayList result = new ArrayList();
                while (rdr.Read())
                {
                    result.Add(this.toFisico(rdr));
                }
                return result;
            }
            finally
            {
                this.close();
            }
        }

        //método que salva os valores lidos no método selectByPat.
        private Fisico toFisico(SqlCeDataReader reader)
        {
            Fisico fisico = new Fisico();

            fisico.idSeq = reader.GetInt64(0);
            fisico.cdFisFilial = reader.GetString(1);
            fisico.cdFisPat = reader.GetString(2);
            fisico.cdFisInc = reader.GetString(3);
            fisico.status = reader.GetString(4);
            fisico.cdFisPlanta = reader.GetString(5);
            fisico.cdFisDepto = reader.GetString(6);
            fisico.cdFisCcusto = reader.GetString(7);
            fisico.cdFisLocal = reader.GetString(8);
            fisico.cdDesc = reader.GetString(9);
            fisico.dsItem = reader.GetString(10);
            fisico.marca = reader.GetString(11);
            fisico.modelo = reader.GetString(12);
            fisico.capacidade = reader.GetString(13);
            fisico.complemento = reader.GetString(14);
            fisico.nrFabricacao = reader.GetString(15);
            fisico.dtEstimada = reader.GetString(16);
            fisico.livre1 = reader.GetString(17);
            fisico.livre2 = reader.GetString(18);
            fisico.livre3 = reader.GetString(19);
            fisico.livre4 = reader.GetString(20);
            fisico.idPalm = reader.GetString(21);
            fisico.dtInventario = reader.GetString(22);
            fisico.os = reader.GetString(23);
            fisico.cdFisPatAntigo = reader.GetString(24);
            fisico.partNumber = reader.GetString(25);
            fisico.situacao = reader.GetString(26);
            fisico.tag = reader.GetString(27);
            fisico.padrao = reader.GetString(28);
            fisico.dtReal = reader.GetString(29);
            fisico.fornecedor = reader.GetString(30);
            fisico.enviado = reader.GetString(31);

            return fisico;
        }

        //retorna o cd_fis_pat do id_seq informado.
        public string returnNoSendPat(Int64 idSeq)
        {
            string result = "";
            try
            {
                this.open();
                SqlCeCommand command = new SqlCeCommand("select cd_fis_pat from tb_fisico where enviado = '0' and id_seq=@idSeq;", this.conn);
                command.Parameters.AddWithValue("@idSeq", idSeq);
                SqlCeDataReader rdr = command.ExecuteReader();
                while (rdr.Read())
                {
                    result = rdr.GetString(0);
                }
            }
            catch (Exception)
            {
                result = "";
            }
            finally
            {
                this.close();
            }
            return result;
        }

        //retorna o proximo idSeq de patrimônio(plaqueta) que ainda não foi enviado (enviado == 0)
        public Int64 nextNoSended(Int64 idSeq)
        {
            Int64 result = 0;
            try
            {
                this.open();
                SqlCeCommand command = new SqlCeCommand("select min(id_seq) from tb_fisico where enviado = '0' and id_seq > @idSeq;", this.conn);
                command.Parameters.AddWithValue("@idSeq", idSeq);
                SqlCeDataReader rdr = command.ExecuteReader();
                while (rdr.Read())
                {
                    result = rdr.GetInt64(0);
                }
            }
            catch (Exception)
            {
                result = 0;
            }
            finally
            {
                this.close();
            }
            return result;
        }

        //retorna anterior idSeq de patrimônio(plaqueta) que ainda não foi enviado (enviado == 0)
        public Int64 beforeNoSended(Int64 idSeq)
        {
            Int64 result = 0;
            try
            {
                this.open();
                SqlCeCommand command = new SqlCeCommand("select max(id_seq) from tb_fisico where enviado = '0' and id_seq < @idSeq;", this.conn);
                command.Parameters.AddWithValue("@idSeq", idSeq);
                SqlCeDataReader rdr = command.ExecuteReader();
                while (rdr.Read())
                {
                    result = rdr.GetInt64(0);
                }
            }
            catch (Exception)
            {
                result = 0;
            }
            finally
            {
                this.close();
            }
            return result;
        }

        //Realiza Update na tabela  Fisico
        public bool updateByCodPat(string plaqueta, string cdFisFilial, string cdFisDepto, string cdFisCcusto, string cdFisLocal, string planta,
                                string cdItem, string dsItem, string marca, string modelo, string padrao, string dtEstimada, string dtReal, string complemento,
                                string nrFabricacao, string capacidade, string partNumber, string livre1, string livre2, string livre3, string livre4,
                                string situacao, string tag, string fornecedor, string data, string user, string os, string patAntigo, string status, string enviado)
        {
            bool resposta = false;
            try
            {
                this.open();
                SqlCeCommand command = new SqlCeCommand("update TB_FISICO set CD_FIS_FILIAL='" + cdFisFilial + "', CD_FIS_DEPTO='" + cdFisDepto + 
                "', CD_FIS_CCUSTO='" + cdFisCcusto +"', CD_FIS_LOCAL='" + cdFisLocal + "', CD_FIS_PLANTA='" + planta + "', CD_DESC = '" + cdItem +
                "', DS_ITEM='" + dsItem + "', MARCA = '" + marca + "', MODELO = '" + modelo + "', PADRAO = '" + padrao + "', DT_ESTIMADA='" + dtEstimada + 
                "', COMPLEMENTO='" + complemento + "', DT_REAL='" + dtReal + "',NR_FABRICACAO = '" + nrFabricacao + "', CAPACIDADE = '" + capacidade +
                "', PART_NUMBER='" + partNumber + "', LIVRE1='" + livre1 + "', LIVRE2='" + livre2 + "', LIVRE3='" + livre3 + "', LIVRE4='" + livre4 +
                "',SITUACAO = '" + situacao + "', TAG='" + tag + "', FORNECEDOR='" + fornecedor + "', DT_INVENTARIO= '" + data + "', ID_PALM='" + user +
                "', OS='" + os + "', CD_FIS_PAT_ANTIGO='" + patAntigo + "', STATUS='" + status + "', ENVIADO='" + enviado + "' WHERE CD_FIS_PAT='" + plaqueta + "';", this.conn);
                command.ExecuteNonQuery();
                resposta = true;
            }
            catch (FormatException)
            {
                resposta = false;
            }
            finally
            {
                this.close();
            }
            return resposta;
        }

        //verifica se a plaqueta lida existe na tabela de Fisico.
        public bool checkPlaqueta(string plaqueta)
        {
            bool result = false;
            try
            {
                this.open();
                SqlCeCommand command = new SqlCeCommand("select * from tb_fisico where cd_fis_pat ='"+plaqueta+"';", this.conn);
                //command.Parameters.AddWithValue("@plaqueta", plaqueta);
                SqlCeDataReader rdr = command.ExecuteReader();
                if (rdr.Read())
                {
                    result = true;
                }
            }
            catch (Exception)
            {
                result = false;
            }
            finally
            {
                this.close();
            }
            return result;
        }

        //Realiza Update no campo statutus para (2) revisado.
        public bool updateRevisado(string plaqueta, string status, string enviado)
        {
            bool resposta = false;
            try
            {
                this.open();
                SqlCeCommand command = new SqlCeCommand("update TB_FISICO set STATUS='" + status+ "', ENVIADO='" + enviado +
                "' WHERE CD_FIS_PAT='" + plaqueta + "';", this.conn);
                command.ExecuteNonQuery();
                resposta = true;
            }
            catch (FormatException)
            {
                resposta = false;
            }
            finally
            {
                this.close();
            }
            return resposta;
        }

        //verifica se existem items para gerar um lote.
        public bool checkGeraLote()
        {
            bool result = false;

            try
            {
                this.open();
                SqlCeCommand command = new SqlCeCommand("SELECT * FROM tb_fisico where enviado = '0';", this.conn);
                SqlCeDataReader rdr = command.ExecuteReader();
                while (rdr.Read())
                {
                    result = true;
                }
            }
            catch (FormatException)
            {
                result = false;
            }
            finally
            {
                this.close();
            }
            return result;
        }

        //update nos arquivos que formaram o lote gerado, mudando seu Enviado para "1".
        public bool atualizaEnviado()
        {
            bool result = false;
            try
            {
                this.open();
                SqlCeCommand command = new SqlCeCommand("update TB_FISICO set ENVIADO='1' WHERE ENVIADO='0';", this.conn);
                command.ExecuteNonQuery();
            }
            catch (FormatException)
            {
                result = false;
            }
            finally
            {
                this.close();
            }
            return result;
        }

    }
}
